package leetcode.editor.cn.dsa12_divideAndConquer;
//给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。
//
// 示例: 
// 输入: [-2,1,-3,4,-1,2,1,-5,4]
// 输出: 6
// 解释: 连续子数组 [4,-1,2,1] 的和最大，为 6。
//
// 进阶: 
// 如果你已经实现复杂度为 O(n) 的解法，尝试使用更为精妙的分治法求解。
//
// Related Topics 数组 分治算法 动态规划 
// 👍 2705 👎 0

public class MaximumSubarray53 {
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 对于含有正数的序列而言，最大子序列肯定是正数，所以头尾肯定都是正数
         * 我们可以从第一个正数开始算起，每往后加一个数便更新一次和的最大值;
         * 当当前和成为负数时，则表明此前序列无法为后面提供最大子序列和，因此必须重新确定序列首项
         */
        public int maxSubArray(int[] nums) {
            int sum = 0, res = nums[0];
            for (int num : nums) {
                if (sum > 0) {
                    sum += num; // 正数拼接上
                } else {
                    sum = num; // 非正数直接舍弃
                }
                // 每次都记录下最大值
                res = res >= sum ? res : sum;
            }
            return res;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
}